# coding = utf-8
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

filePath = "img\\cat.jpg"

# cv.imread()函数用于读取图像，需要注意的是，该图像应该处在Python代码源文件或者已给出完整路径的工作目录中。
# 针对函数的第二个参数，通过以下几个例子分别说明各自功能。
# - cv.IMREAD_COLOR：默认参数，以彩色模式加载图像，图像的透明度将被忽略。
# - cv.IMREAD_GRAYSCALE：以灰度模式加载图像。
# - cv.IMREAD_UNCHANGED：以alpha通道模式加载图像。
# 注意：你也可以通过传递1，0，-1来代替上面三个函数功能。
img = cv.imread(filePath, cv.IMREAD_COLOR)


# 读取图像，解决imread不能读取中文路径的问题
def cv_imread(filePath, flags=cv.IMREAD_COLOR):
    return cv.imdecode(np.fromfile(filePath, dtype=np.uint8), flags)


# img=cv_imread(filePath,cv.IMREAD_COLOR)


# cv.imshow()函数被用于在窗口中显示图像，窗口会自动适应图像大小。
# 其中，函数的第一个参数是窗口的名称，是字符串类型。第二个参数是要加载的图像。
# 你可以显示多个图像窗口，但是每个窗口名称必须不同。
cv.imshow("1", img)

# cv.waitKey()是一个键盘事件函数，它的参数以毫秒为单位，该函数在毫秒的时间内去等待键盘事件，
# 如果时间之内有键盘事件触发则程序继续，如果函数参数设置为0，则无限时间的等待键盘事件触发。
# 它也可以设置为检测指定按键的触发，比如等待按键a的触发，我们将在下面讨论。
#
# 注意：这个函数除了可以等待键盘事件的触发之外还可以处理很多其他的GUI事件，所以你必须把它放在显示图像函数之后。
cv.waitKey(0)

# cv.destroyAllWindow()函数用于关闭我们所创建的所有显示图像的窗口，
# 如果想要关闭特定的窗口，请使用cv.destroyWindow()函数，把要关闭的窗口名称作为参数。
#
# 注意：特别地，你也可以先创建一个窗口，再加载图像。
# 在这种情况下，你可以使用cv.nameWindow()函数自行调整窗口大小。
# 函数默认参数是cv.WINDOW_AUTOSIZE。你可以使用cv.WINDOW_NORMAL函数，以自行调整窗口大小。当图像尺寸太大或者需要添加滚动条时， 上述函数将会非常有用。
cv.destroyAllWindows()

# cv.imwrite()函数用于保存图像。其中第一个参数是保存为的图片名，第二个参数为待保存图像。
cv.imwrite("img/2.jpg", img)

# Matplotlib 测试
# 注意：OpenCV加载的彩色图像处于BGR模式，但Matplotlib以RGB模式显示。因此，如果使用OpenCV读取图像，则Matplotlib中的彩色图像将无法正确显示
plt.imshow(img, cmap='gray', interpolation='bicubic')
plt.xticks([]), plt.yticks([])  # to hide tick values on X and Y axis
plt.show()
